package br.uff.javaavancado.service;

import br.uff.javaavancado.controletransacao.Transacional;
import br.uff.javaavancado.dao.ProdutoDAO;
import br.uff.javaavancado.dao.controle.FabricaDeDao;
import br.uff.javaavancado.dao.impl.ProdutoDAOImpl;
import br.uff.javaavancado.exception.AplicacaoException;
import br.uff.javaavancado.exception.ObjetoNaoEncontradoException;
import br.uff.javaavancado.modelos.Categoria;
import br.uff.javaavancado.modelos.Produto;
import java.util.List;

public class ProdutoService extends BaseService implements Service, java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private ProdutoDAO produtoDAO;

    public ProdutoService() {
        super(ProdutoService.class);
        try {
            produtoDAO = FabricaDeDao.getDao(ProdutoDAOImpl.class, Produto.class);
        } catch (Exception e) {
        }
    }

    @Transacional
    public Produto salvar(Produto produto) {
        return produtoDAO.inclui(produto);
    }

    @Transacional
    public void atualizar(Produto produto) {
        produtoDAO.altera(produto);
    }

    @Transacional
    public void excluir(Produto produto) throws AplicacaoException {
        try {
            produto = produtoDAO.getPorIdComLock(produto.getId());
            produtoDAO.exclui(produto);
        } catch (ObjetoNaoEncontradoException ex) {
            throw new AplicacaoException("Produto nao encontrado");
        }
    }

    public List<Produto> buscaProdutoPorNome(String busca) {
        busca = "%"+busca.toUpperCase()+"%";
        return produtoDAO.buscaProdutoPorNome(busca);
    }
            
    public List<Produto> getTrackLista(Produto produto) {
        return produtoDAO.recuperaListaTrack();
    }
    
    public List<Produto> getListaOrdenada(Categoria categoria) {
        return produtoDAO.getProdutosPorCategoria(categoria);
    }
    
    public List<Produto> getListaCompleta(){
        return produtoDAO.getListaCompleta();
    }
}
